package com.qdlc.p2p.dal.dao;

import java.util.List;

import com.qdlc.p2p.dal.common.dao.BaseDao;
import com.qdlc.p2p.dal.common.model.jpa.PageDataList;
import com.qdlc.p2p.dal.dto.BorrowTender;
import com.qdlc.p2p.dal.dto.User;
import com.qdlc.p2p.dal.dto.UserWineCoupons;
import com.qdlc.p2p.dal.model.UserWineCouponsModel;

/**
 * 用户酒券获取记录DAO接口
 * @author ygw
 * @version 1.1.0.0
 * @since 2016年05月06日 13时53分30秒
 */
public interface UserWineCouponsDao extends BaseDao<UserWineCoupons> {

    /**
     * 查询用户酒券获取记录
     * 
     * @param id 主键ID
     * @return用户酒券获取记录实体
     */
    UserWineCoupons getUserWineCouponsById(long id);
    
    /**
	 * 把用户酒券置为无效
	 * 
	 * @param id 用户酒券主键ID
	 */
	void doInvalid(long id);
	
	/**
	 * 分页查询用户酒券记录
	 * 
	 * @param model UserWineCouponsModel
	 * @return PageDataList<UserWineCouponsModel>
	 */
	PageDataList<UserWineCouponsModel> list(UserWineCouponsModel model);
	
	/**
	 * 根据用户ID获取可使用酒券列表
	 * 
	 * @param userId 查询用户ID
	 * @return List<UserWineCouponsModel>
	 */
	List<UserWineCoupons> useableList(long userId);
	
	/**
	 * 根据用户ID获取可使用酒券个数
	 * 
	 * @param userId
	 * @return 酒券个数
	 */
	int userableCount(long userId);

    boolean checkCanUseWineCoupons(long[] WineCouponsIds, long userId, byte redType);

	/**
	 * 根据用户ID获取不可使用酒券列表
	 * 
	 * @param userId 查询用户ID
	 * @return List<UserWineCoupons>
	 */
	List<UserWineCoupons> notAvailableList(long userId);
	
	/**
	 * 根据ID获取选择使用酒券的值
	 * 
	 * @param WineCouponsIds 酒券ID集合
	 * @param toUserId 用户
	 * @return 酒券总额
	 */
	double getTotalAmountByIds(long[] WineCouponsIds, long toUserId);
	
	/**
	 * 获取用户投标使用酒券金额
	 * 
	 * @param tenderId
	 * @return
	 */
	double getTenderUseAmount(long tenderId);
	
	
	/**
	 * 投资借款标冻结酒券
	 * 
	 * @param borrowTender 投标对象
	 * @param WineCouponsIds 酒券ID集合
	 */
	void tenderBorrowFreezeWineCoupons(BorrowTender borrowTender, long[] WineCouponsIds);
	
	/**
	 * 投资借款标使用酒券
	 * 
	 * @param tenderId
	 */
	void tenderBorrowUseWineCoupons(long tenderId);
	
	/**
	 * 投资借款标失败酒券还原
	 * 
	 * @param borrowTender 投标对象
	 */
	void tenderBorrowFailUseWineCoupons(BorrowTender borrowTender);
	
	/**
	 * 根据使用类型和外键ID获取酒券总额
	 * 
	 * @param useType 使用类型
	 * @param keyId 外键ID
	 * @return
	 */
	double getTotalAmountByUseTypeANdKeyId(String useType, long keyId);
	
	/**
	 * 根据时间获取酒券总额
	 * @param date
	 * @return
	 */
	double getUserRedPacketFeeByDate(String date);
	
	/**
	 * 校验所选择酒券是否均为现金酒券
	 * 
	 * @param WineCouponsIds 酒券ID集合
	 * @param toUser 用户
	 * @return
	 */
	boolean checkIsCashWineCoupons(long[] WineCouponsIds, User toUser);
	
	/**
	 * 校验所选择酒券是否过期
	 * 
	 * @param WineCouponsIds 酒券ID集合
	 * @param toUser 用户
	 * @return
	 */
	boolean checkIsOverdueEnvelope(long[] WineCouponsIds, User toUser);
	
	/**
	 * 酒券置为使用
	 *
     * @param ids 酒券ID集合
	 * @param useType 使用类型
     * @param preStatus 前状态
     * @param keyId 关联KeyId 如：投标 则标的ID
	 */
    int doUse(List<Long> ids, String useType, byte preStatus, Long keyId);

    /**
     * @param WineCouponsIds
     * @param preStatus
     * @param aftStatus
     * @return
     */
    int changeStatus(long[] WineCouponsIds, int preStatus, int aftStatus);

	/**
	 * 酒券过期处理
	 */
	void wineCouponsExpireDispose();
	
	/**
	 * 检测用户使用的酒券状态
	 * 
	 * @param WineCouponsIds
	 * @param user
	 * @return
	 */
	boolean checkWineCoupons(long[] WineCouponsIds, User user);
	/**
	 * 根据状态查询对应 酒券总额
	 * @param status
	 * @return
	 */
	double getUseWineCouponsSumByStatus(int status,String date);

	/**
	 * 查询用户酒券记录
	 * 
	 * @param model UserWineCouponsModel
	 * @return List<UserWineCouponsModel>
	 */
	List<UserWineCouponsModel> getAllList(UserWineCouponsModel model);

	/**
	 * 根据ids查询酒券
	 * 
	 * @param List<Long> ids
	 * @return List<UserWineCoupons>
	 */
	List<UserWineCoupons> getWineCouponsByIds(List<Long> ids);
}
